package com.kh.rationaldrugreview.controller;

import com.kh.rationaldrugreview.neo4j.entity.DrugNode;
import com.kh.rationaldrugreview.neo4j.service.DrugKnowledgeService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;

/**
 * 药品知识图谱控制器
 * 基于Neo4j图数据库，提供药品关系查询、相互作用检测、禁忌症查询等功能
 * 
 * @author Claude Code
 * @version 1.0
 */
@RestController
@RequestMapping("/api/knowledge")
@RequiredArgsConstructor
public class DrugKnowledgeController {
    
    private final DrugKnowledgeService drugKnowledgeService;
    
    /**
     * 获取知识图谱中的所有药品节点
     * 
     * @return 药品节点列表
     */
    @GetMapping("/drugs")
    public ResponseEntity<List<DrugNode>> getAllDrugs() {
        List<DrugNode> drugs = drugKnowledgeService.findAllDrugs();
        return ResponseEntity.ok(drugs);
    }
    
    /**
     * 根据药品编码获取知识图谱中的药品节点
     * 
     * @param drugCode 药品编码
     * @return 药品节点信息，如果未找到返回404
     */
    @GetMapping("/drugs/{drugCode}")
    public ResponseEntity<DrugNode> getDrugByCode(@PathVariable String drugCode) {
        Optional<DrugNode> drug = drugKnowledgeService.findDrugByCode(drugCode);
        return drug.map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());
    }
    
    /**
     * 根据药品名称搜索知识图谱中的药品
     * 支持模糊匹配
     * 
     * @param name 药品名称关键字
     * @return 匹配的药品节点列表
     */
    @GetMapping("/drugs/search")
    public ResponseEntity<List<DrugNode>> searchDrugs(@RequestParam String name) {
        List<DrugNode> drugs = drugKnowledgeService.searchDrugsByName(name);
        return ResponseEntity.ok(drugs);
    }
    
    /**
     * 根据有效成分搜索药品节点
     * 支持模糊匹配有效成分
     * 
     * @param ingredient 有效成分关键字
     * @return 包含该有效成分的药品节点列表
     */
    @GetMapping("/drugs/ingredient/{ingredient}")
    public ResponseEntity<List<DrugNode>> getDrugsByIngredient(@PathVariable String ingredient) {
        List<DrugNode> drugs = drugKnowledgeService.findDrugsByActiveIngredient(ingredient);
        return ResponseEntity.ok(drugs);
    }
    
    /**
     * 根据药品分类获取药品节点列表
     * 
     * @param category 药品分类
     * @return 该分类下的药品节点列表
     */
    @GetMapping("/drugs/category/{category}")
    public ResponseEntity<List<DrugNode>> getDrugsByCategory(@PathVariable String category) {
        List<DrugNode> drugs = drugKnowledgeService.findDrugsByCategory(category);
        return ResponseEntity.ok(drugs);
    }
    
    /**
     * 获取与指定药品存在相互作用的药品列表
     * 通过知识图谱中的INTERACTS_WITH关系查询
     * 
     * @param drugCode 药品编码
     * @return 存在相互作用的药品节点列表
     */
    @GetMapping("/interactions/{drugCode}")
    public ResponseEntity<List<DrugNode>> getInteractingDrugs(@PathVariable String drugCode) {
        List<DrugNode> interactingDrugs = drugKnowledgeService.findInteractingDrugs(drugCode);
        return ResponseEntity.ok(interactingDrugs);
    }
    
    /**
     * 查询两个药品之间的具体相互作用信息
     * 
     * @param drugCode1 第一个药品编码
     * @param drugCode2 第二个药品编码
     * @return 相互作用详细信息，如果不存在相互作用返回404
     */
    @GetMapping("/interactions/{drugCode1}/{drugCode2}")
    public ResponseEntity<Object> getInteractionBetweenDrugs(
            @PathVariable String drugCode1, 
            @PathVariable String drugCode2) {
        Object interaction = drugKnowledgeService.findInteractionBetweenDrugs(drugCode1, drugCode2);
        if (interaction != null) {
            return ResponseEntity.ok(interaction);
        }
        return ResponseEntity.notFound().build();
    }
    
    /**
     * 根据疾病/症状查询有禁忌症的药品
     * 
     * @param condition 疾病或症状关键字
     * @return 对该疾病/症状有禁忌症的药品节点列表
     */
    @GetMapping("/contraindications/{condition}")
    public ResponseEntity<List<DrugNode>> getDrugsContraindicatedFor(@PathVariable String condition) {
        List<DrugNode> drugs = drugKnowledgeService.findDrugsContraindicatedFor(condition);
        return ResponseEntity.ok(drugs);
    }
    
    /**
     * 根据适应症查询适用的药品
     * 
     * @param indication 适应症关键字
     * @return 适用于该适应症的药品节点列表
     */
    @GetMapping("/indications/{indication}")
    public ResponseEntity<List<DrugNode>> getDrugsForIndication(@PathVariable String indication) {
        List<DrugNode> drugs = drugKnowledgeService.findDrugsForIndication(indication);
        return ResponseEntity.ok(drugs);
    }
    
    /**
     * 根据严重程度查询药物相互作用
     * 
     * @param severity 严重程度 (SEVERE/MODERATE/MILD)
     * @return 指定严重程度的相互作用列表
     */
    @GetMapping("/interactions/severity/{severity}")
    public ResponseEntity<List<Object>> getInteractionsBySeverity(@PathVariable String severity) {
        List<Object> interactions = drugKnowledgeService.findInteractionsBySeverity(severity);
        return ResponseEntity.ok(interactions);
    }
    
    /**
     * 创建新的药品节点到知识图谱
     * 
     * @param drugNode 药品节点信息
     * @return 创建成功的药品节点
     */
    @PostMapping("/drugs")
    public ResponseEntity<DrugNode> createDrugNode(@RequestBody DrugNode drugNode) {
        DrugNode savedNode = drugKnowledgeService.saveDrugNode(drugNode);
        return ResponseEntity.ok(savedNode);
    }
    
    /**
     * 从知识图谱中删除药品节点
     * 
     * @param id 药品节点ID
     * @return 无内容响应
     */
    @DeleteMapping("/drugs/{id}")
    public ResponseEntity<Void> deleteDrugNode(@PathVariable Long id) {
        drugKnowledgeService.deleteDrugNode(id);
        return ResponseEntity.noContent().build();
    }
}